package Api.YinLianPay.YinLianQRCode;

import Util.HttpUtil;
import Util.MyKey;
import net.glxn.qrgen.QRCode;
import net.glxn.qrgen.image.ImageType;

import java.io.File;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import static Util.Tools.MaptoStr;
import static Util.Tools.getMD5;

/**
 * 银联扫码支付Api
 *
 * 返回汇付宝收银台二维码 or 直接返回二维码自己封装收银台
 */
public class YinLianQRCodeApi {

    public static void main(String[] args) {
        try {
            // 目标URL
            String url = "https://pay.heepay.com/Payment/Index.aspx";
            //需要的MD5密钥，商户后台网关密钥下面第一个
            String key = MyKey.MD5Key;
            //商户编号，（汇付宝商户内码：七位整数数字）
            String agent_id = "1664502";
            //子商户号
            String ref_agent_id = "";
            // 获取当前14位时间戳
            Date now = new Date();
            // 创建 SimpleDateFormat 对象，指定日期格式
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
            String timestamp = dateFormat.format(now);
            //固定版本号
            String version = "1";
            String pay_type = "64";
            String agent_bill_id = timestamp;
            String agent_bill_time = timestamp;
            String pay_amt = "0.01";
            /*
            支付后的异步地址，URL参数是以http://或https://开头的完整URL地址(后台处理)，提交的url地址必须外网能访问到，否则无法通知商户。值可以为空，但不可以为null。
             */
            String notify_url = "https://www.baidu.com/";
            String return_url = "https://www.baidu.com/";
            String user_ip = "127_127_12_12";
            String goods_num = "1";
            String goods_name = "购买盒子掌中苹果   宇宙无界";
            String goods_name1 = URLEncoder.encode(goods_name, "GBK");
            String remark = "商户自定义,原样返回,可以为空";
            String remark1 = URLEncoder.encode(remark, "GBK");
            String goods_note = "支付说明,比如购买商品";
            String goods_note1 = URLEncoder.encode(goods_note, "GBK");

            String sign_type = "MD5";


            // 请求参数，以Map形式表示
            Map<String, String> parameters = new HashMap<String, String>();
                //拼接待加密参数
                StringBuilder builder = new StringBuilder();
                builder.append("version=");
                builder.append(version);
                builder.append("&agent_id=");
                builder.append(agent_id);
                builder.append("&agent_bill_id=");
                builder.append(agent_bill_id);
                builder.append("&agent_bill_time=");
                builder.append(agent_bill_time);
                builder.append("&pay_type=");
                builder.append(pay_type);
                builder.append("&pay_amt=");
                builder.append(pay_amt);
                builder.append("&notify_url=");
                builder.append(notify_url);
                builder.append("&return_url=");
                builder.append(return_url);
                builder.append("&user_ip=");
                builder.append(user_ip);
                builder.append("&key=");
                builder.append(key);


                String Date = builder.toString();
                System.out.println("待签名串：" + Date);

                //MD5加密得出签名结果
                String sign = getMD5(Date);

                parameters.put("version", version);
                parameters.put("pay_type", pay_type);
                parameters.put("agent_id", agent_id);
                parameters.put("agent_bill_id", agent_bill_id);
                parameters.put("agent_bill_time", agent_bill_time);
                parameters.put("pay_amt", pay_amt);
                parameters.put("notify_url", notify_url);
                parameters.put("return_url", return_url);
                parameters.put("user_ip", user_ip);
                parameters.put("goods_name", goods_name1);
                parameters.put("goods_num", goods_num);
                parameters.put("remark", remark1);
                parameters.put("goods_note", goods_note1);
                parameters.put("sign_type", sign_type);
                parameters.put("sign", sign);

                //打印请求参数
                String Str = MaptoStr(parameters);
                System.out.println("发送请求数据："+ Str);


                // 使用 HttpClient 发送 POST 请求
                String Response = HttpUtil.sendPost2(url, parameters);
                System.out.println(Response);
            // 解析返回json结果，得到二维码地址
            String QRCodeUrl = "";
            try {
                String[] parts = Response.split("\"qr_code_url\":\"");
                if (parts.length > 1) {
                    QRCodeUrl = parts[1].split("\"")[0];
                    System.out.println("二维码地址：" + QRCodeUrl);
                } else {
                    throw new Exception("响应中未找到二维码地址");
                }
            } catch (Exception e) {
                System.err.println("解析响应失败: " + e.getMessage());
                return;
            }

            // 定义目标目录路径
            String directoryPath = "D:/picture/ylqr";

            // 创建目录（自动创建多级目录）
            File directory = new File(directoryPath);
            if (!directory.exists() && !directory.mkdirs()) {
                System.err.println("目录创建失败，请检查权限或路径是否正确");
                return;
            }

            // 生成时间戳文件名（精确到毫秒）
            String timestamp1 = System.currentTimeMillis() + ".png";
            File targetFile = new File(directory, timestamp1);

            // 生成二维码并保存
            try {
                QRCode.from(QRCodeUrl)
                        .withSize(300, 300)
                        .to(ImageType.PNG)
                        .file(String.valueOf(targetFile));
                System.out.println("二维码已保存至: " + targetFile.getAbsolutePath());
            } catch (Exception e) {
                System.err.println("二维码生成失败，请检查路径或权限是否正确");
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    }

